SPDX-FileCopyrightText: 2020 Bassam Boughaba & Eliott Steylemans SPDX-FileCopyrightText: 2024 AlICe laboratory https://alicelab.be
SPDX-License-Identifier: GPL-3.0-or-later
Réinterpretation de Dimensions I & II, Manfred Mohr Bassam Boug & Eliott Steylemans date 17/12/2020 Option AIM 2020-2021 module 1
import bpy
import bmesh
import numpy as np
import random
from random import randrange, uniformload custom helper module _ = bpy.data.texts[“helper_module.py”].as_module() .check_import() .delete_all_objects()
def clean():
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete(use_global=False)
    bpy.ops.outliner.orphans_purge()
clean()Run camera script + adding a key light for rendering
filename1 = "camera.py"
exec(compile(open(filename1).read(), filename1, "exec"))Create system of coordinates
context = bpy.contextSize of the system
size = uniform(1, 3)
position_inner_cube_x = uniform(-2, 2)
position_inner_cube_y = uniform(-2, 2)
position_inner_cube_z = uniform(-2, 2)
verts = (
    [
        -1 * size + position_inner_cube_x,
        -1 * size + position_inner_cube_y,
        -1.0 * size + position_inner_cube_z,
    ],
    [
        -1.0 * size + position_inner_cube_x,
        -1.0 * size + position_inner_cube_y,
        1.0 * size + position_inner_cube_z,
    ],
    [
        -1.0 * size + position_inner_cube_x,
        1.0 * size + position_inner_cube_y,
        -1.0 * size + position_inner_cube_z,
    ],
    [
        -1.0 * size + position_inner_cube_x,
        1.0 * size + position_inner_cube_y,
        1.0 * size + position_inner_cube_z,
    ],
    [
        1.0 * size + position_inner_cube_x,
        -1.0 * size + position_inner_cube_y,
        -1.0 * size + position_inner_cube_z,
    ],
    [
        1.0 * size + position_inner_cube_x,
        -1.0 * size + position_inner_cube_y,
        1.0 * size + position_inner_cube_z,
    ],
    [
        1.0 * size + position_inner_cube_x,
        1.0 * size + position_inner_cube_y,
        -1.0 * size + position_inner_cube_z,
    ],
    [
        1.0 * size + position_inner_cube_x,
        1.0 * size + position_inner_cube_y,
        1.0 * size + position_inner_cube_z,
    ],
    [-5, -5, -5],
    [-5, -5, 5],
    [-5, 5, -5],
    [-5, 5, 5],
    [5, -5, -5],
    [5, -5, 5],
    [5, 5, -5],
    [5, 5, 5],
)Index of vertices in console to help us code
print("==========")
print("System of coordonates ([Index] + [x, y, z]) :")
for i, item in enumerate(verts, start=1):
    print(i, item)Creation of the complete outer cube
Edges of the base of the outer cube
edges = {"outer_cube_base": [(12, 14), (14, 10), (10, 8), (8, 12)]}Creation of the base of the outer cube
me = bpy.data.meshes.new("Outer_cube_base")
me.from_pydata(verts, edges["outer_cube_base"], [])
ob = bpy.data.objects.new("outer_cube_base", me)
context.collection.objects.link(ob)
context.view_layer.objects.active = obEdges of the outer_cube
edges = {
    "outer_cube": [
        (14, 15),
        (15, 13),
        (12, 13),
        (15, 11),
        (11, 10),
        (8, 9),
        (9, 13),
        (11, 9),
    ]
}Creation of outer_cube
me = bpy.data.meshes.new("Outer_cube")
me.from_pydata(verts, edges["outer_cube"], [])
ob = bpy.data.objects.new("outer_cube", me)
context.collection.objects.link(ob)
context.view_layer.objects.active = obCreation of the inner cube Choice between two variants of construction
variant_choice_list = [0, 1]
random_choice = random.choice(variant_choice_list)
print("==========")
print("If = 0 -> Left side, else -> right side: ")
print(random_choice)Creation of the edges we need
if random_choice == 0:
    edges = {
        "group_1": [(14, 6), (6, 4), (4, 5), (5, 1), (5, 13)],
        "group_2": [(10, 2), (2, 6), (6, 7), (7, 5), (7, 15)],
        "group_3": [(8, 0), (0, 2), (2, 3), (3, 7), (3, 11)],
        "group_4": [(12, 4), (4, 0), (0, 1), (1, 3), (1, 9)],
    }
else:
    edges = {
        "group_1": [(14, 6), (6, 2), (2, 3), (3, 1), (3, 11)],
        "group_2": [(10, 2), (2, 0), (0, 1), (1, 5), (1, 9)],
        "group_3": [(8, 0), (0, 4), (4, 5), (5, 7), (5, 13)],
        "group_4": [(12, 4), (4, 6), (6, 7), (7, 3), (7, 15)],
    }faces = ((0, 1, 3, 2), (2, 3, 7, 6), (6, 7, 5, 4), (4, 5, 1, 0), (2, 6, 4, 0), (7, 3, 1, 5))
me = bpy.data.meshes.new(“Cube”) me.from_pydata(verts, [], faces) ob = bpy.data.objects.new(“Inner Cube”, me) context.collection.objects.link(ob) context.view_layer.objects.active = ob
Creation of the different groups
print("==========")
print("Creation of groups")
for i in range(1, 5):
    me = bpy.data.meshes.new("Group_{}".format(i))
    me.from_pydata(verts, edges["group_{}".format(i)], [])
    ob = bpy.data.objects.new("group_{}".format(i), me)
    context.collection.objects.link(ob)
    context.view_layer.objects.active = ob
    print(me)Deformation for the object to be only visible in a certain point of view
def deformation(group, index1, index2):Select vertices
    bpy.ops.object.select_all(action="DESELECT")
    objectToSelect = bpy.data.objects[group]
    objectToSelect.select_set(True)
    bpy.context.view_layer.objects.active = objectToSelect
    bpy.ops.object.mode_set(mode="EDIT")
    bpy.ops.mesh.select_mode(type="VERT")
    bpy.ops.mesh.select_all(action="DESELECT")we need to switch from Edit mode to Object mode so the selection gets updated
    bpy.ops.object.mode_set(mode="OBJECT")Selection of the vertices we need
    for i in range(index1, index2):
        objectToSelect.data.vertices[i].select = TrueEnter edit mode
    bpy.ops.object.mode_set(mode="EDIT")Translation
    facteur_deplacement = uniform(2, 4)
    bpy.ops.transform.translate(
        value=(
            0.339 * facteur_deplacement,
            -0.339 * facteur_deplacement,
            0.64 * facteur_deplacement,
        )
    )Exit edit mode for next step
    bpy.ops.object.mode_set(mode="OBJECT")
    bpy.ops.object.select_all(action="DESELECT")
deformation("group_2", 0, 8)
deformation("group_4", 0, 8)
deformation("outer_cube", 10, 14)From edges to curve
def make_pipe(group, depth):Select the edges
    bpy.ops.object.select_all(action="DESELECT")
    objectToSelect = bpy.data.objects[group]
    objectToSelect.select_set(True)
    bpy.context.view_layer.objects.active = objectToSelectConvert edge to curve
    bpy.ops.object.convert(target="CURVE")
    bpy.context.object.data.bevel_depth = depth
    bpy.context.object.data.bevel_resolution = 8
    bpy.context.object.data.use_fill_caps = True
make_pipe("group_1", 0.2)
make_pipe("group_2", 0.2)
make_pipe("group_3", 0.2)
make_pipe("group_4", 0.2)
make_pipe("outer_cube", 0.2)
make_pipe("outer_cube_base", 0.2)Deselect
bpy.ops.object.select_all(action="DESELECT")